https://arxiv.org/abs/2001.07685
あまりに解説の出来が良さすぎる日本語のQiita記事があるので、これを読む前提で、自分がわからなかった点だけメモする。
https://qiita.com/AmethysT/items/0fee904aeca06c2ae5cf
SONYのいい動画。
Pseudo Labelが満たしてほしい条件
Self-supervised Learningにおける、Pseudo Labelの付与して、それをground truthとして扱って学習するのはよく見る話である。
Pseudo Labelに限らず、Labelに満たしてほしい性質は以下の通り。
- 似ているデータは同じラベルを持つ。
- クラスタ仮定、平滑化仮定とも呼ばれる。
- 識別境界はデータの近くを通らない。
- データのない低密度な領域に識別境界が存在している。
これを考慮すると、Pseudo Labelが満たしてほしいのは以下のような条件である。
- Entropy Minimization
- エントロピーが小さい=明確にクラス分布がわかる。
- Consistency Regularization
- モデルの入力は多少変わっていても、同じPseudo Labelであるべき。
FixMatchにおいての実現
FixMatchでも、Consistency Regularizationは考えている。この手法では、弱いデータ拡張と強いデータ拡張という2つの概念を提唱している。
記号の説明
- Labeledのデータセット ラベルはone-hot。
- Unlabeledのデータセット
- クラス分類で、バッチサイズは。のデータ数の比は。
- 識別器による予測分布。
- 確率分布の間のクロスエントロピー。
- は強いデータ拡張。は弱いデータ拡張
- 先行研究では、はVAT(仮想的な敵対訓練)、指数移動平均などの変換であった。
Related Work
ラベルなしデータの損失関数は以下のようにあらわすことができる。ここで、は変換であり、が予測したデータ分布である。これらはすべて非決定的であり、分布の中からのサンプリングである、と考えられる。
そして、Pseudo Label付与の基準としては、一定の閾値を、予測結果の最大の成分が超えたら付与するということになる。
提案手法
損失はについてのものと、についてのもの両方を計算する。
- のデータに弱いデータ拡張を施して、それの識別器のクラスの予測ハードラベルを得る。
- このをPseudo Labelとして、に付与する。
- 次に、同じに対して、強いデータ拡張を施して、予測し、先ほどの弱い拡張によるPseudo Labelとのクロスエントロピー誤差を計算する。
- のデータに与えられたラベルについて、普通に損失を計算する。
- 全体の損失関数はハイパーパラメタによって以下のように得ることができる。
強い、弱いデータ拡張とは何なのか
弱いデータ拡張は、
- 50%の確率で左右を反転させる。
- 画像を上下左右にランダムに移動させる。動かす量は画像の縦横のそれぞれ12.5%以内である。
強いデータ拡張は、Python Imaging Libraryに定義されている以下の動作を使う。(GPT先生曰く)
- 回転(Rotation):
- 画像を指定された角度だけ回転させます。
- 例:
Image.rotate(angle)
- シアー(Shear):
- 画像を斜め方向に引き伸ばします。
- 例:
Image.transform((width, height), Image.AFFINE, (1, shear, 0, 0, 1, 0))
- コントラスト調整(Contrast Adjustment):
- 画像のコントラストを調整します。
- 例:
ImageEnhance.Contrast(image).enhance(factor)
- 明るさ調整(Brightness Adjustment):
- 画像の明るさを調整します。
- 例:
ImageEnhance.Brightness(image).enhance(factor)
- 彩度調整(Saturation Adjustment):
- 画像の色の鮮やかさを調整します。
- 例:
ImageEnhance.Color(image).enhance(factor)
- ぼかし(Blur):
- 画像にぼかし効果を適用します。
- 例:
Image.filter(ImageFilter.BLUR)
- シャープ化(Sharpen):
- 画像をシャープにします。
- 例:
Image.filter(ImageFilter.SHARPEN)
- ソーラライズ(Solarize):
- 画像のピクセル値を反転します。
- 例:
ImageOps.solarize(image, threshold)
- ポスタライズ(Posterize):
- 画像のビット数を減らし、色の階調を粗くします。
- 例:
ImageOps.posterize(image, bits)
- 等高線抽出(Equalize):
- 画像のヒストグラムを平坦化してコントラストを均一にします。
- 例:
ImageOps.equalize(image)
- インバート(Invert):
- 画像の色を反転させます。
- 例:
ImageOps.invert(image)
- ランダムクロップ(Random Crop):
- 画像をランダムに切り取ります。
- 例:
ImageOps.crop(image, border)
どのように組み合わせるかについて、
- 強化学習ベースの手法AutoAugment。これは強化学習で、どの組み合わせが優秀なのかを決めている。
- ランダムなRandAugment, (謎)CTAugmentを使用している。
また、他に単独にCutoutという一部の画像を黒い■で塗りつぶすものもある。
他との組み合わせ
この手法自体はVAT、移動指数平均などほかの手法と簡単に組み合わせることができる。
実験結果
抜群によかったぜ。
